home *** CD-ROM | disk | FTP | other *** search
/ START Magazine / START VOL 4 NO 10.st / info_src.arc / RES.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-02-01  |  79.8 KB  |  2,164 lines

  1. {InfoBaseST by James W. Maki (c) Copyright 1990 by Antic Publishing, Inc.}
  2. {$M+}
  3. {$E+}
  4.  
  5. Program Resource_Module;
  6.  
  7.       {$I A:GEMSUBS.PAS }
  8.       {$I A:AUXSUBS.PAS }
  9.  
  10.  Const
  11.       {$I B:MOD_CONS.PAS }
  12.  
  13.  Type
  14.       {$I B:MOD_TYPE.PAS }
  15.  
  16.  Var
  17.       {$I B:MOD_VAR.PAS }
  18.  
  19. {   **********************  External  **********************************   }
  20.   procedure DrawScreen( CurRec : ScrPtr ) ;
  21.      External ;
  22.  
  23.   procedure DrawAField( CurRec : ScrPtr ) ;
  24.      External ;
  25.  
  26.   procedure DrawRecord( CurRec : DataPtr ) ;
  27.      External ;
  28.  
  29.   procedure DrawDesign ;
  30.      External ;
  31.  
  32.   procedure DrawDZ_Out ;
  33.      External ;
  34.      
  35.   procedure EraseARec( CurRec : ScrPtr ) ;
  36.      External ;
  37.  
  38.   procedure PrintRec(DataRec : DataPtr ) ;
  39.      External ;
  40.  
  41.   procedure M_PrintRec ;
  42.      External ;
  43.  
  44.   procedure PrintReport ;
  45.      External ;
  46.  
  47.   procedure DisposeRecs(Var FirstRec, CurRec, LastRec : ScrPtr ) ;
  48.      External ;
  49.  
  50.   procedure DisposeInt(Var FirstRec, CurRec, LastRec : IntPtr ) ;
  51.      External ;
  52.  
  53.   procedure UpdateInfoLine ;
  54.      External ;
  55.  
  56.   procedure IncrementRecord(Var  CurRec : DataPtr ; Value : short_integer ;
  57.                                  DrawFlag : boolean ) ;
  58.      External ;
  59.      
  60.   procedure GoToFirst(Var CurRec : DataPtr ; DrawFlag : boolean ) ;
  61.      External ;
  62.      
  63.   procedure GoToLast(Var CurRec : DataPtr ; DrawFlag : boolean) ;
  64.      External ;
  65.      
  66.   procedure ClearRecord( CurRec : DataPtr ) ;
  67.      External ;
  68.  
  69.   procedure CreateDataRec(ScrNum : short_integer) ;
  70.      External ;
  71.  
  72.   procedure DeleteRecord ;
  73.      External ;
  74.      
  75.   procedure DeleteScrRec ;
  76.      External ;
  77.  
  78.   procedure DeleteARec(CurRec : ScrPtr) ;
  79.      External ;
  80.  
  81.   procedure DS_DeleteARec(CurRec : DataPtr) ;
  82.      External ;
  83.  
  84.   procedure DetCurRec(    D_CurRec : DataStorePtr ;
  85.                       Var CurRec   : DataStorePtr ;  
  86.                       Var Location : short_integer ) ;
  87.      External ;
  88.  
  89.   procedure ModifyStr(CurRec : DataPtr ; Location : short_integer ; 
  90.                       InChar : char) ;
  91.      External ;
  92.  
  93.   procedure EraseCursor(ScrMode : short_integer) ;
  94.      External ;
  95.  
  96.   procedure NewCursor(ScrMode : short_integer) ;
  97.      External ;
  98.  
  99.   procedure CheckCurLoc(Var CurLoc : short_integer ;
  100.                         Var Current : ScrPtr ; 
  101.                             XPos, YPos, ScrMode : short_integer ) ;
  102.      External ;
  103.  
  104.   procedure CheckOverLap( NewRec : ScrPtr ; X, Y : short_integer ;
  105.                          Var OverLap : boolean ) ;
  106.      External ;
  107.  
  108.   procedure AddARec(Var FirstRec, CurRec, LastRec, ScrRec : ScrPtr ;
  109.                         TitleStr : Str255 ;
  110.                         XCur, YCur, Size : short_integer ;
  111.                         DataType : char ; ScrNum : short_integer) ;
  112.      External ;
  113.  
  114.   procedure Int_AddARec(Var FirstRec, CurRec, LastRec : IntPtr ; 
  115.                             Value : short_integer ) ;
  116.      External ;
  117.  
  118.   procedure CalcOffset(    FirstRec, CurRec : ScrPtr ; 
  119.                        Var Offset : short_integer ) ;
  120.      External ;
  121.  
  122.   procedure SaveDataBase(ModeNumber : short_integer) ;
  123.      External ;
  124.  
  125.   procedure GetDataBase ;
  126.      External ;
  127.  
  128.   procedure MergeDataBase ;
  129.      External ;
  130.  
  131.   procedure SaveScrnInfo ;
  132.      External ;
  133.  
  134.   procedure OpenScrnInfo( Var Flag : boolean) ;
  135.      External ;
  136.  
  137.   procedure GetPrtInfo ;
  138.      External ;
  139.  
  140.   procedure SavePrtInfo ;
  141.      External ;
  142.  
  143.   procedure SortRecords(CurRec : DataPtr; Var NewMode : short_integer ) ;
  144.      External ;
  145.  
  146.   procedure SearchDataBase(Var NewMode : short_integer ) ;
  147.      External ;
  148.  
  149.   procedure D_DisposeRecs(Var FirstRec, CurRec, LastRec : DataPtr ) ;
  150.      External ;
  151.  
  152.   procedure ClrHome ;
  153.      External ;
  154.  
  155.   procedure FormatCheck( CurRec : DataPtr ) ;
  156.      External ;     
  157.  
  158.   procedure ModifyWName ;
  159.      External ;
  160.  
  161.   procedure GetStr(CurRec : DataPtr ; Var DisplayStr : Str255 ;
  162.                    Start, Size : short_integer ) ;
  163.      External ;
  164.  
  165.   procedure FillString(Var SourceStr : Str50 ; FillChar : char ) ;
  166.      External ;
  167.  
  168.   procedure InitPrinter(PrintInit : Str20) ;
  169.      External ;
  170.  
  171.   procedure Set_VSlideSize ;
  172.      External ;
  173.  
  174.   procedure Event_Loop ;
  175.      External ;
  176.  
  177.   procedure Press_Tab ;
  178.      External ;
  179.      
  180.   procedure DiskError(IO_Result : short_integer ) ;
  181.      EXTERNAL ;
  182.      
  183. {   ********************************************************************   }
  184.  
  185. { *************************************************************************
  186.      Save Decision presents an alert box warning of possible loss of data
  187.      due to an open or close request.
  188. ************************************************************************* }
  189.   procedure SaveDecision(Var Result : short_integer) ;
  190.  
  191.      begin
  192.        if D_FirstRec[DataNum] <> nil then
  193.           begin
  194.             if EditFlag[ScrNum] then
  195.                begin
  196.                  AlertStr := '[2][  |You May Lose Modified Data| ' ;
  197.                  AlertStr := Concat(AlertStr, '|     Data Disposition|  ]') ;
  198.                  AlertStr := Concat(AlertStr, '[ Save | Ignore | Cancel ]') ;
  199.                  Result   := Do_Alert(AlertStr,1) ;
  200.                  if Result = 1 then
  201.                     SaveDataBase(DataNum) ;
  202.                end
  203.             else
  204.                Result := 2 ;
  205.           end
  206.        else
  207.           Result := 2 ;
  208.      end ;
  209.  
  210. { *************************************************************************
  211.      D_SaveDecision presents an alert box warning of possible loss of data
  212.      due to an open or close request.
  213. ************************************************************************* }
  214.   procedure D_SaveDecision(Var Result : short_integer) ;
  215.  
  216.      begin
  217.        if S_FirstRec[ScrNum] <> nil then
  218.           begin
  219.             if D_EditFlag[ScrNum] then
  220.                begin
  221.                  AlertStr := '[2][             |You May Lose Modified Design| ' ;
  222.                  AlertStr := Concat(AlertStr, '|     Design Disposition? |  ]') ;
  223.                  AlertStr := Concat(AlertStr, '[ Save | Ignore | Cancel ]') ;
  224.                  Result   := Do_Alert(AlertStr,1) ;
  225.                  if Result = 1 then
  226.                     SaveScrnInfo ;
  227.                end
  228.             else
  229.                Result := 2 ;
  230.           end
  231.        else
  232.           Result := 2 ;
  233.      end ;
  234. { *************************************************************************
  235.      R_SaveDecision presents an alert box warning of possible loss of data
  236.      due to an open or close request.
  237. ************************************************************************* }
  238.   procedure R_SaveDecision(Var Result : short_integer) ;
  239.  
  240.      begin
  241.        AlertStr := '[2][             |You May Lose Report Design| ' ;
  242.        AlertStr := Concat(AlertStr, '|       Disposition? |  ]') ;
  243.        AlertStr := Concat(AlertStr, '[ Save | Ignore | Cancel ]') ;
  244.        Result   := Do_Alert(AlertStr,1) ;
  245.        if Result = 1 then
  246.           SavePrtInfo ;
  247.      end ;
  248.  
  249. { *************************************************************************
  250.      Alert box presents decision to merge data base in memory with one
  251.      on disk or replace memory data base with one on disk.
  252. ************************************************************************* }
  253.   procedure MergeDecision(Var Result : short_integer) ;
  254.  
  255.      begin
  256.        if D_FirstRec[DataNum] <> nil then
  257.           begin
  258.             AlertStr := '[2][|    Replace Database or    | ' ;
  259.             AlertStr := Concat(AlertStr, '|      Merge Data Base   |  ]') ;
  260.             AlertStr := Concat(AlertStr, '[ Merge | Replace | Cancel ]') ;
  261.             Result   := Do_Alert(AlertStr,2) ;
  262.           end ;
  263.      end ;
  264.  
  265. { *************************************************************************
  266.      Dialog Box to input Report parameters.
  267. ************************************************************************* }
  268.   procedure ReportSetUp(Var AbortFlag : boolean ) ;
  269.  
  270.     Var
  271.        i, 
  272.        SaveMode  : short_integer ;
  273.        Out       : Dialog_Ptr;
  274.        OutScreen : Tree_Index;
  275.        OutItem   : array[1..23] of short_integer;
  276.        LabStr    : array[1..3] of Str20 ;
  277.        RepStr    : Str20 ;
  278.        GetEditStr    : Str255 ;
  279.        DataRec   : DataStorePtr ;
  280.        Result    : short_integer ;
  281.  
  282.      begin
  283.        WriteV(LabStr[1], LabSpace[1]) ;
  284.        WriteV(LabStr[2], LabLine) ;
  285.        WriteV(LabStr[3], LabSpace[2]) ;
  286.        WriteV(RepStr, RepLine) ;
  287.        SaveMode := P_Mode ;
  288.  
  289.        Out := New_Dialog(23, 0, 0, 70, 22);
  290.        Center_Dialog(Out);
  291.  
  292.        OutItem[1] := Add_DItem(Out, G_BoxText, 0, 
  293.                                25, 1, 20, 1, -1, 4096 | 256 | 128);
  294.        Set_DText(Out, OutItem[1], ' Report Parameters ' ,
  295.                  System_Font, TE_Center);
  296.  
  297.        OutItem[2] := Add_DItem(Out, G_IBox, 0, 
  298.                                1, 3, 48, 9, -1, 4096 | 256 | 128);
  299.  
  300.        OutItem[3] := Add_DItem(Out, G_IBox, 0, 
  301.                                54, 3, 12, 18, -1, 4096 | 256 | 128);
  302.  
  303.        OutItem[4] := Add_DItem(Out, G_IBox, 0, 
  304.                                1, 12, 48, 9, -1, 4096 | 256 | 128);
  305.  
  306.        OutItem[5] := Add_DItem(Out, G_IBox, 0, 
  307.                                1, 12, 48, 9, -1, 4096 | 256 | 128);
  308.  
  309.  
  310.        OutItem[6] := Add_DItem(Out, G_FText, Editable,
  311.                                  30, 4, 16, 1, 0, 256 | 128);
  312.        Set_DEdit(Out, OutItem[6], 'Report Lines   _', 
  313.                                   '9', 
  314.                                   RepStr, System_Font, TE_Center);
  315.  
  316.        OutItem[7] := Add_DItem(Out, G_FText, Editable,
  317.                                  30, 6, 16, 1, 0, 256 | 128);
  318.        Set_DEdit(Out, OutItem[7], 'Top Lines     __', 
  319.                                             '99', 
  320.                                    LabStr[1], System_Font, TE_Center);
  321.  
  322.        OutItem[8] := Add_DItem(Out, G_FText, Editable,
  323.                                  30, 8, 16, 1, 0, 256 | 128);
  324.        Set_DEdit(Out, OutItem[8], 'Label Lines   __', 
  325.                                                 '99', 
  326.                                    LabStr[2], System_Font, TE_Center);
  327.  
  328.        OutItem[9] := Add_DItem(Out, G_FText, Editable,
  329.                                  30, 10, 16, 1, 0, 256 | 128);
  330.        Set_DEdit(Out, OutItem[9], 'Bottom Lines  __', 
  331.                                                '99', 
  332.                                    LabStr[3], System_Font, TE_Center);
  333.  
  334.        OutItem[10] := Add_DItem(Out, G_FText, Editable,
  335.                                  18, 13, 27, 1, 0, 256 | 128);
  336.        Set_DEdit(Out, OutItem[10], 'Init : ____________________', 
  337.                                           'XXXXXXXXXXXXXXXXXXXX', 
  338.                                           PrtInit[1], System_Font, TE_Center);
  339.  
  340.        OutItem[11] := Add_DITem(Out, G_BoxText, 
  341.                                    Selectable | Radio_Btn ,
  342.                                    5, 4, 14, 1, -2, 4096 | 256 | 128) ;
  343.        Set_DText(Out, OutItem[11], 'Report', System_Font, TE_Center) ;
  344.  
  345.        OutItem[12] := Add_DITem(Out, G_BoxText, 
  346.                                    Selectable | Radio_Btn ,
  347.                                    5, 7, 14, 1, -2, 4096 | 256 | 128) ;
  348.        Set_DText(Out, OutItem[12], 'Single Label', System_Font, TE_Center) ;
  349.  
  350.        OutItem[13] := Add_DITem(Out, G_BoxText, 
  351.                                    Selectable | Radio_Btn ,
  352.                                    5, 9, 14, 1, -2, 4096 | 256 | 128) ;
  353.        Set_DText(Out, OutItem[13], 'Multi Label', System_Font, TE_Center) ;
  354.  
  355.        OutItem[14] := Add_DItem(Out, G_BoxText, 
  356.                                  Default | Exit_Btn | Selectable,
  357.                                  55, 7, 10, 1, -3, 4096 | 256 | 128);
  358.        Set_DText(Out, OutItem[14], 
  359.                                  'Continue', System_Font, TE_Center);
  360.  
  361.        OutItem[15] := Add_DItem(Out, G_BoxText, 
  362.                                  Exit_Btn | Selectable,
  363.                                  55, 10, 10, 1, -2, 4096 | 256 | 128);
  364.        Set_DText(Out, OutItem[15], 
  365.                                  'Abort', System_Font, TE_Center);
  366.  
  367.        OutItem[16] := Add_DItem(Out, G_BoxText, 
  368.                                  Selectable,
  369.                                  3, 13, 10, 1, -2, 4096 | 256 | 128);
  370.        Set_DText(Out, OutItem[16], 
  371.                                  'WIDE', System_Font, TE_Center);
  372.  
  373.        OutItem[17] := Add_DITem(Out, G_BoxText, 
  374.                                    Selectable | Exit_Btn | Radio_Btn ,
  375.                                    55, 4, 10, 1, -2, 4096 | 256 | 128) ;
  376.        Set_DText(Out, OutItem[17], 'LOAD', System_Font, TE_Center) ;
  377.  
  378.  
  379.        OutItem[18] := Add_DItem(Out, G_BoxText, 
  380.                                  Selectable,
  381.                                  3, 15, 10, 1, -2, 4096 | 256 | 128);
  382.        Set_DText(Out, OutItem[18], 
  383.                                  'BOLD', System_Font, TE_Center);
  384.  
  385.        OutItem[19] := Add_DItem(Out, G_FText, Editable,
  386.                                  18, 15, 27, 1, 0, 256 | 128);
  387.        Set_DEdit(Out, OutItem[19], 'Bold : ____________________', 
  388.                                           'XXXXXXXXXXXXXXXXXXXX', 
  389.                                           PrtInit[2], System_Font, TE_Center);
  390.  
  391.        OutItem[20] := Add_DItem(Out, G_BoxText, 
  392.                                  Selectable,
  393.                                  3, 17, 10, 1, -2, 4096 | 256 | 128);
  394.        Set_DText(Out, OutItem[20], 
  395.                                  'ITALICS', System_Font, TE_Center);
  396.  
  397.        OutItem[21] := Add_DItem(Out, G_FText, Editable,
  398.                                  18, 17, 27, 1, 0, 256 | 128);
  399.        Set_DEdit(Out, OutItem[21], 'Ital : ____________________', 
  400.                                           'XXXXXXXXXXXXXXXXXXXX', 
  401.                                           PrtInit[3], System_Font, TE_Center);
  402.  
  403.        OutItem[22] := Add_DItem(Out, G_BoxText, 
  404.                                  Selectable,
  405.                                  3, 19, 10, 1, -2, 4096 | 256 | 128);
  406.        Set_DText(Out, OutItem[22], 
  407.                                  'SPECIAL', System_Font, TE_Center);
  408.  
  409.        OutItem[23] := Add_DItem(Out, G_FText, Editable,
  410.                                  18, 19, 27, 1, 0, 256 | 128);
  411.        Set_DEdit(Out, OutItem[23], 'Spec : ____________________', 
  412.                                           'XXXXXXXXXXXXXXXXXXXX', 
  413.                                           PrtInit[4], System_Font, TE_Center);
  414.  
  415.        if P_Mode = 2 then
  416.           Obj_SetState(Out, OutItem[11], Selected, false)
  417.        else
  418.           if P_Mode = 1 then
  419.              Obj_SetState(Out, OutItem[13], Selected, false)
  420.           else
  421.              Obj_SetState(Out, OutItem[12], Selected, false) ;
  422.  
  423.        for i := 1 to 4 do
  424.            if PrtFlag[i] then
  425.               Obj_SetState(Out, OutItem[14 + i * 2], Selected, false) ;
  426.  
  427.        OutScreen := Do_Dialog(Out, 6);
  428.  
  429.        if OutScreen = 17 then
  430.           begin
  431.             Result := 1 ;
  432.             if R_EditFlag then
  433.                R_SaveDecision(Result) ;
  434.             if Result <> 3 then
  435.                GetPrtInfo 
  436.             else
  437.                AbortFlag := true ;
  438.             ShortDraw := true ;
  439.             Event_Loop ;
  440.           end
  441.        else
  442.  
  443.        if OutScreen <> 15 then
  444.           begin
  445.             AbortFlag := false ;
  446.             for i := 11 to 13 do
  447.                 if Obj_State(Out, OutItem[i]) & Selected <> 0 then
  448.                    Case i of
  449.                      11 : P_Mode := 2 ;
  450.                      12 : P_Mode := 0 ;
  451.                      13 : P_Mode := 1 ;
  452.                    end ;
  453.             
  454.             for i := 1 to 4 do
  455.                 if Obj_State(Out, OutItem[14 + i * 2]) & Selected <> 0 then
  456.                    PrtFlag[i] := true
  457.                 else
  458.                    PrtFlag[i] := false ;
  459.             if Obj_State(Out, OutItem[16]) & Selected <> 0 then
  460.                RepWidth := 132
  461.             else
  462.                RepWidth := 80 ;
  463.  
  464.             Get_DEdit(Out, OutItem[10], GetEditStr);
  465.             PrtInit[1] := GetEditStr ;
  466.             Get_DEdit(Out, OutItem[19], GetEditStr);
  467.             PrtInit[2] := GetEditStr ;
  468.             Get_DEdit(Out, OutItem[21], GetEditStr);
  469.             PrtInit[3] := GetEditStr ;
  470.             Get_DEdit(Out, OutItem[23], GetEditStr);
  471.             PrtInit[4] := GetEditStr ;
  472.             
  473.             Get_DEdit(Out, OutItem[6], GetEditStr);
  474.             if GetEditStr <> '' then
  475.                begin
  476.                  ReadV(GetEditStr, RepLine) ;
  477.                  if RepLine > 4 then RepLine := 4
  478.                  else
  479.                     if RepLine < 1 then RepLine := 1 ;
  480.                end
  481.             else
  482.                RepLine := 1 ;
  483.  
  484.             Get_DEdit(Out, OutItem[7], GetEditStr);
  485.             if GetEditStr <> '' then
  486.                ReadV(GetEditStr, LabSpace[1])
  487.             else
  488.                LabSpace[1] := 0 ;
  489.  
  490.             Get_DEdit(Out, OutItem[8], GetEditStr) ;
  491.             if GetEditStr <> '' then
  492.                begin
  493.                  ReadV(GetEditStr, LabLine) ;
  494.                  if LabLine > 10 then LabLine := 10
  495.                  else
  496.                     if LabLine < 1 then LabLine := 1 ;
  497.                end
  498.             else
  499.                LabLine := 5 ;
  500.  
  501.             Get_DEdit(Out, OutItem[9], GetEditStr);
  502.             if GetEditStr <> '' then
  503.                ReadV(GetEditStr, LabSpace[2])
  504.             else
  505.                LabSpace[2] := 1 ;
  506.             if P_Mode <> SaveMode then
  507.                begin
  508.                  Result := 1 ;
  509.                  if R_EditFlag then
  510.                     R_SaveDecision(Result) ;
  511.                  if Result <> 3 then
  512.                     begin
  513.                       DataRec := D_CurrentRec[Report]^.Data ;
  514.                       While DataRec <> nil do
  515.                         begin
  516.                           FillString(DataRec^.DataStr, chr($20)) ;
  517.                           DataRec := DataRec^.Next ;
  518.                         end ;
  519.                     end ;
  520.                end
  521.             else
  522.                P_Mode := SaveMode ;
  523.           end
  524.        else
  525.           AbortFlag := true ;
  526.  
  527.        End_Dialog(Out);
  528.        Delete_Dialog(Out);
  529.        if Mode = 5 then
  530.           DrawDesign ;
  531.        ShortDraw := true ;
  532.      end ;
  533. { *************************************************************************
  534.      AcceptTitle displays a dialog box to allow entry of pertinent
  535.      information about a new record field.
  536. ************************************************************************* }
  537.   procedure AcceptTitle(    DisplayStr : Str255 ; 
  538.                         Var ResultStr  : Window_Title ;
  539.                         Var Size,
  540.                             XPos, 
  541.                             YPos     : short_integer ;
  542.                         Var DataType : char ;
  543.                         Var Result   : boolean  ) ;
  544.  
  545.     var
  546.        i,
  547.        StartSize     : short_integer ;
  548.        TitleIn       : Dialog_Ptr;
  549.        TitleInScreen : Tree_Index;
  550.        TitleInItem   : array[1..16] of short_integer;
  551.        GetEditStr    : Str255 ;
  552.        XStr, YStr,
  553.        SpStr, DecStr : Str20 ;
  554.        TypeSelect    : boolean ;
  555.        
  556.      begin
  557.        WriteV(XStr, XPos) ;
  558.        WriteV(YStr, YPos) ;
  559.        WriteV(SpStr, Size) ;
  560.        WriteV(DecStr, DecReal) ;
  561.        TitleIn := New_Dialog(16, 0, 0, 50, 18);
  562.        Center_Dialog(TitleIn);
  563.  
  564.        TitleInItem[1] := Add_DItem(TitleIn, G_BoxText, 0, 
  565.                                  15, 1, 16, 1, -1, 4096 | 256 | 128);
  566.        Set_DText(TitleIn, TitleInItem[1], DisplayStr,
  567.                  System_Font, TE_Center);
  568.  
  569.        TitleInItem[2] := Add_DItem(TitleIn, G_FBoxText, Editable,
  570.                                  5, 3, 40, 2, 0, 4096 | 256 | 128);
  571.        Set_DEdit(TitleIn, TitleInItem[2], 
  572.                           'Enter Field Label: ____________________', 
  573.                                              'XXXXXXXXXXXXXXXXXXXX', 
  574.                            ResultStr, System_Font, TE_Center);
  575.  
  576.        TitleInItem[3] := Add_DItem(TitleIn, G_FText, Editable,
  577.                                  4, 6, 14, 1, 0, 256 | 128);
  578.        Set_DEdit(TitleIn, TitleInItem[3], 'X Position: __', 
  579.                                           '99', 
  580.                                            XStr, System_Font, TE_Center);
  581.  
  582.        TitleInItem[4] := Add_DItem(TitleIn, G_FText, Editable,
  583.                                  4, 8, 14, 1, 0, 256 | 128);
  584.        Set_DEdit(TitleIn, TitleInItem[4], 'Y Position: __', 
  585.                                           '99', 
  586.                                           YStr, System_Font, TE_Center);
  587.  
  588.        TitleInItem[5] := Add_DItem(TitleIn, G_FText, Editable,
  589.                                  4, 10, 14, 1, 0, 256 | 128);
  590.        Set_DEdit(TitleIn, TitleInItem[5], 'Max Size:   __', 
  591.                                           '99', 
  592.                                            SpStr, System_Font, TE_Center);
  593.  
  594.        TitleInItem[6] := Add_DItem(TitleIn, G_FText, Editable,
  595.                                  4, 12, 16, 1, 0, 256 | 128);
  596.        Set_DEdit(TitleIn, TitleInItem[6], 'Real Decimal : _', 
  597.                                           '9', 
  598.                                            DecStr, System_Font, TE_Center);
  599.  
  600.        TitleInItem[7] := Add_DITem(TitleIn, G_Button, 
  601.                                    Selectable | Radio_Btn ,
  602.                                    24, 7, 8, 1, -1, 256 | 128) ;
  603.        Set_DText(TitleIn, TitleInItem[7], 'String', System_Font, TE_Center) ;
  604.  
  605.        TitleInItem[8] := Add_DITem(TitleIn, G_Button, 
  606.                                    Selectable | Radio_Btn ,
  607.                                    24, 9, 8, 1, -1, 256 | 128) ;
  608.        Set_DText(TitleIn, TitleInItem[8], 'Boolean', System_Font, TE_Center) ;
  609.  
  610.        TitleInItem[9] := Add_DITem(TitleIn, G_Button, 
  611.                                    Selectable | Radio_Btn ,
  612.                                    24, 11, 8, 1, -1, 256 | 128) ;
  613.        Set_DText(TitleIn, TitleInItem[9], 'Integer', System_Font, TE_Center) ;
  614.  
  615.        TitleInItem[10] := Add_DITem(TitleIn, G_Text, 
  616.                                    None,
  617.                                    24, 13, 8, 1, -1, 256 | 128) ;
  618.        Set_DText(TitleIn, TitleInItem[10], '', System_Font, TE_Center) ;
  619.  
  620.        TitleInItem[11] := Add_DITem(TitleIn, G_Button, 
  621.                                    Selectable | Radio_Btn ,
  622.                                    38, 7, 8, 1, -1, 256 | 128) ;
  623.        Set_DText(TitleIn, TitleInItem[11], 'Real', System_Font, TE_Center) ;
  624.  
  625.        TitleInItem[12] := Add_DITem(TitleIn, G_Button, 
  626.                                    Selectable | Radio_Btn ,
  627.                                    38, 9, 8, 1, -1, 256 | 128) ;
  628.        Set_DText(TitleIn, TitleInItem[12], '$', System_Font, TE_Center) ;
  629.  
  630.        TitleInItem[13] := Add_DITem(TitleIn, G_Button, 
  631.                                    Selectable | Radio_Btn ,
  632.                                    38, 11, 8, 1, -1, 256 | 128) ;
  633.        Set_DText(TitleIn, TitleInItem[13], 'Date', System_Font, TE_Center) ;
  634.  
  635.        TitleInItem[14] := Add_DITem(TitleIn, G_Button, 
  636.                                    Selectable | Radio_Btn ,
  637.                                    38, 13, 8, 1, -1, 256 | 128) ;
  638.        Set_DText(TitleIn, TitleInItem[14], 'Name', System_Font, TE_Center) ;
  639.  
  640.  
  641.        TitleInItem[15] := Add_DItem(TitleIn, G_BoxText, 
  642.                                  Default | Exit_Btn | Selectable,
  643.                                  5, 14, 10, 1, -3, 4096 | 256 | 128);
  644.        Set_DText(TitleIn, TitleInItem[15], 
  645.                                  'Continue', System_Font, TE_Center);
  646.  
  647.        TitleInItem[16] := Add_DItem(TitleIn, G_BoxText, 
  648.                                  Exit_Btn | Selectable,
  649.                                  5, 16, 10, 1, -2, 4096 | 256 | 128);
  650.        Set_DText(TitleIn, TitleInItem[16], 
  651.                                  'Delete', System_Font, TE_Center);
  652.  
  653.        TypeSelect := false ;
  654.        for i := $41 to $49 do
  655.            if chr(i) = DataType then
  656.               begin
  657.                 Obj_SetState(TitleIn, TitleInItem[i - $3A], Selected, false) ;
  658.                 TypeSelect := true ;
  659.               end ;
  660.        if NOT TypeSelect then
  661.           Obj_SetState(TitleIn, TitleInItem[7], Selected, false) ;
  662.  
  663.        TitleInScreen := Do_Dialog(TitleIn, 2);
  664.  
  665.        if TitleInScreen <> 16 then
  666.           begin
  667.             Get_DEdit(TitleIn, TitleInItem[2], GetEditStr);
  668.             ResultStr := GetEditStr ;
  669.  
  670.             Get_DEdit(TitleIn, TitleInItem[3], GetEditStr);
  671.             if GetEditStr <> '' then
  672.                ReadV(GetEditStr, XPos) 
  673.             else
  674.                XPos := 1 ;
  675.  
  676.             Get_DEdit(TitleIn, TitleInItem[4], GetEditStr);
  677.             if GetEditStr <> '' then
  678.                ReadV(GetEditStr, YPos) 
  679.             else
  680.                YPos := 1 ;
  681.  
  682.             Get_DEdit(TitleIn, TitleInItem[5], GetEditStr);
  683.             if GetEditStr <> '' then
  684.                ReadV(GetEditStr, Size)
  685.             else
  686.                Size := 1 ;
  687.             
  688.             if ((XPos + Length(ResultStr) + Size > 72) OR (XPos < 1)) AND
  689.                (XPos > 1) then
  690.                begin
  691.                  AlertStr := '[2][|  Modifying X Position | ' ;
  692.                  AlertStr := Concat(AlertStr, '|   Change if Desired|  ]') ;
  693.                  AlertStr := Concat(AlertStr, '[ Continue]') ;
  694.                  i := Do_Alert(AlertStr,1) ;
  695.                end ;
  696.             if XPos < 1 then 
  697.                XPos := 1
  698.             else
  699.                if XPos > 1 then
  700.                   repeat
  701.                     if Size > 72 - Length(ResultStr) - XPos then
  702.                        XPos := XPos - 1 ;
  703.                   until (Size <= 72 - Length(ResultStr) - XPos) OR (XPos < 2)  ;
  704.  
  705.             if (YPos > 14) OR (YPos < 1) then
  706.                begin
  707.                  AlertStr := '[2][|  Modifying Y Position| ' ;
  708.                  AlertStr := Concat(AlertStr, '|   Change if Desired|  ]') ;
  709.                  AlertStr := Concat(AlertStr, '[ Continue]') ;
  710.                  i := Do_Alert(AlertStr,1) ;
  711.                end ;
  712.             if YPos > 14 then YPos := 14
  713.             else
  714.                if YPos < 1 then YPos := 1 ;
  715.  
  716.             if Size < 1 then Size := 1
  717.             else
  718.                begin
  719.                  StartSize := Size ;
  720.                  if Size > 72 - Length(ResultStr) - XPos then
  721.                     Size := 72 - Length(ResultStr) - XPos ;
  722.                  if Size < 0 then Size  := 1 ;
  723.                  if Size <> StartSize then
  724.                     begin
  725.                       AlertStr := '[2][  |  Altering Size of Field  | ' ;
  726.                       AlertStr := Concat(AlertStr, '|     Modify if Desired|  ]') ;
  727.                       AlertStr := Concat(AlertStr, '[ Continue]') ;
  728.                       i := Do_Alert(AlertStr,1) ;
  729.                     end ;
  730.                end ;
  731.  
  732.             Get_DEdit(TitleIn, TitleInItem[6], GetEditStr);
  733.             if GetEditStr <> '' then
  734.                begin
  735.                  ReadV(GetEditStr, DecReal) ;
  736.                  if DecReal < 1 then DecReal := 1 ;
  737.                end
  738.             else
  739.                DecReal := 1 ;
  740.  
  741.             for i := 7 to 14 do
  742.                 if Obj_State(TitleIn, TitleInItem[i]) & Selected <> 0 then
  743.                    DataType := chr(i + $3A) ;
  744.  
  745.             if (DataType = 'B') OR (DataType = 'D') then
  746.                Size := 1 ;
  747.  
  748.             Result := true ;
  749.           end
  750.        else
  751.           Result := false ;
  752.  
  753.        End_Dialog(TitleIn);
  754.        Delete_Dialog(TitleIn);
  755.      end;
  756.  
  757. { *************************************************************************
  758.      Displays a dialog box with program and copyright information.
  759. ************************************************************************* }
  760.   procedure CopyRight ;
  761.  
  762.     var
  763.        CR       : Dialog_Ptr;
  764.        CRScreen : Tree_Index;
  765.        CRItem   : array[1..12] of short_integer;
  766.        
  767.      begin
  768.        CR := New_Dialog(13, 0, 0, 42, 18);
  769.        Center_Dialog(CR);
  770.  
  771.        CRItem[1] := Add_DItem(CR, G_BoxText, 0, 
  772.                                  12, 1, 18, 1, -1, 4096 | 256 | 128);
  773.        Set_DText(CR, CRItem[1], 'InfoBaseST', 
  774.                                 System_Font, TE_Center);
  775.  
  776.        CRItem[2] := Add_DItem(CR, G_Text, 0, 
  777.                                  1, 3, 40, 1, -1, 4096 | 256 | 128);
  778.        Set_DText(CR, CRItem[2], 'Copyright (c) 1990', 
  779.                                 System_Font, TE_Center);
  780.  
  781.        CRItem[3] := Add_DItem(CR, G_Text, 0, 
  782.                                  1, 5, 40, 1, -1, 4096 | 256 | 128);
  783.        Set_DText(CR, CRItem[3], 'Antic Publishing, Inc.', 
  784.                                 System_Font, TE_Center);
  785.  
  786.        CRItem[5] := Add_DItem(CR, G_Text, 0, 
  787.                                  1, 12, 40, 1, -1, 4096 | 256 | 128);
  788.        Set_DText(CR, CRItem[5], '<><><><><><><><><><><><><><><><><><><><>', 
  789.                                 System_Font, TE_Center);
  790.  
  791.        CRItem[6] := Add_DItem(CR, G_Text, 0, 
  792.                                  1, 13, 40, 1, -1, 4096 | 256 | 128);
  793.        Set_DText(CR, CRItem[6], '<>    Portions of this program are    <>', 
  794.                                 System_Font, TE_Center);
  795.  
  796.        CRItem[7] := Add_DItem(CR, G_Text, 0, 
  797.                                  1, 14, 40, 1, -1, 4096 | 256 | 128);
  798.        Set_DText(CR, CRItem[7], '<>Copyright (c) 1986 CCD and OSS, Inc.<>', 
  799.                                 System_Font, TE_Center);
  800.  
  801.        CRItem[8] := Add_DItem(CR, G_Text, 0, 
  802.                                  1, 15, 40, 1, -1, 4096 | 256 | 128);
  803.        Set_DText(CR, CRItem[8], '<>      Used by permission of OSS     <>', 
  804.                                 System_Font, TE_Center);
  805.  
  806.        CRItem[9] := Add_DItem(CR, G_Text, 0, 
  807.                                  1, 16, 40, 1, -1, 4096 | 256 | 128);
  808.        Set_DText(CR, CRItem[9], '<><><><><><><><><><><><><><><><><><><><>', 
  809.                                 System_Font, TE_Center);
  810.  
  811.        CRItem[10] := Add_DItem(CR, G_BoxText, 
  812.                                  Default | Exit_Btn | Selectable,
  813.                                  16, 10, 10, 1, -3, 4096 | 256 | 128);
  814.        Set_DText(CR, CRItem[10], 'Continue', System_Font, TE_Center);
  815.  
  816.        CRItem[11] := Add_DItem(CR, G_Text, 0, 
  817.                                  1, 8, 40, 1, -1, 4096 | 256 | 128);
  818.        Set_DText(CR, CRItem[11], 'James W. Maki', 
  819.                                 System_Font, TE_Center);
  820.  
  821.        CRItem[12] := Add_DItem(CR, G_Text, 0, 
  822.                                  1, 7, 40, 1, -1, 4096 | 256 | 128);
  823.        Set_DText(CR, CRItem[12], 'by', 
  824.                                 System_Font, TE_Center);
  825.  
  826.  
  827.        CRScreen := Do_Dialog(CR, 0);
  828.  
  829.        End_Dialog(CR);
  830.        Delete_Dialog(CR);
  831.      end;
  832.  
  833.  
  834.   procedure HelpScreen ;
  835.   
  836.     TYPE
  837.        HelpLine = STRING[57] ;
  838.  
  839.     var
  840.        CR       : Dialog_Ptr;
  841.        CRScreen : Tree_Index;
  842.        CRItem   : array[1..35] of short_integer;
  843.  
  844.        i        : BYTE ;
  845.        OutStr   : HelpLine ;
  846.        HelpFv   : FILE OF HelpLine ;
  847.        SaveIO_Result : SHORT_INTEGER ;
  848.        
  849.     LABEL 1 ;
  850.        
  851.      begin
  852.        CR := New_Dialog(35, 0, 0, 70, 23);
  853.        Center_Dialog(CR);
  854.  
  855.        CRItem[1] := Add_DItem(CR, G_Text, 0, 
  856.                                  1, 1, 57, 1, -1, 4096 | 256 | 128);
  857.        Set_DText(CR, CRItem[1], 'INFOBASEST HELP FACILITY', 
  858.                                 System_Font, TE_Center);
  859.  
  860.        CRItem[2] := Add_DItem(CR, G_Box,0, 
  861.                                  59, 0, 11, 23, -2, 4096 | 256 | 128);
  862.  
  863.        CRItem[3] := Add_DItem(CR, G_BoxText, 
  864.                                   Exit_Btn | Selectable,
  865.                                  61, 1, 8, 1, -2, 4096 | 256 | 128);
  866.        Set_DText(CR, CRItem[3], 'DataType', System_Font, TE_Center);
  867.  
  868.        CRItem[4] := Add_DItem(CR, G_BoxText, 
  869.                                   Exit_Btn | Selectable,
  870.                                  61, 3, 8, 1, -2, 4096 | 256 | 128);
  871.        Set_DText(CR, CRItem[4], 'Keys', System_Font, TE_Center);
  872.  
  873.        CRItem[5] := Add_DItem(CR, G_BoxText, 
  874.                                   Exit_Btn | Selectable,
  875.                                  61, 5, 8, 1, -2, 4096 | 256 | 128);
  876.        Set_DText(CR, CRItem[5], 'InfoLine', System_Font, TE_Center);
  877.  
  878.        CRItem[6] := Add_DItem(CR, G_BoxText, 
  879.                                   Exit_Btn | Selectable,
  880.                                  61, 7, 8, 1, -2, 4096 | 256 | 128);
  881.        Set_DText(CR, CRItem[6], 'GEM', System_Font, TE_Center);
  882.  
  883.        CRItem[7] := Add_DItem(CR, G_BoxText, 
  884.                                   Exit_Btn | Selectable,
  885.                                  61, 9, 8, 1, -2, 4096 | 256 | 128);
  886.        Set_DText(CR, CRItem[7], 'Cursor', System_Font, TE_Center);
  887.  
  888.        CRItem[8] := Add_DItem(CR, G_BoxText, 
  889.                                   Exit_Btn | Selectable,
  890.                                  61, 11, 8, 1, -2, 4096 | 256 | 128);
  891.        Set_DText(CR, CRItem[8], 'Files', System_Font, TE_Center);
  892.  
  893.        CRItem[9] := Add_DItem(CR, G_BoxText, 
  894.                                   Exit_Btn | Selectable,
  895.                                  61, 13, 8, 1, -2, 4096 | 256 | 128);
  896.        Set_DText(CR, CRItem[9], 'Filter', System_Font, TE_Center);
  897.  
  898.        CRItem[10] := Add_DItem(CR, G_BoxText, 
  899.                                   Exit_Btn | Selectable,
  900.                                  61, 15, 8, 1, -2, 4096 | 256 | 128);
  901.        Set_DText(CR, CRItem[10], '@ Comms', System_Font, TE_Center);
  902.  
  903.        CRItem[11] := Add_DItem(CR, G_BoxText, 
  904.                                   Exit_Btn | Selectable,
  905.                                  61, 17, 8, 1, -2, 4096 | 256 | 128);
  906.        Set_DText(CR, CRItem[11], 'Create', System_Font, TE_Center);
  907.  
  908.        CRItem[12] := Add_DItem(CR, G_BoxText, 
  909.                                   Exit_Btn | Selectable,
  910.                                  61, 19, 8, 1, -2, 4096 | 256 | 128);
  911.        Set_DText(CR, CRItem[12], 'Mode', System_Font, TE_Center);
  912.  
  913.        CRItem[13] := Add_DItem(CR, G_BoxText, 
  914.                                  Default | Exit_Btn | Selectable,
  915.                                  61, 21, 8, 1, -3, 4096 | 256 | 128);
  916.        Set_DText(CR, CRItem[13], 'EXIT', System_Font, TE_Center);
  917.  
  918.        IO_Check(false) ;
  919.        RESET(HelpFv,HelpFileName) ;
  920.        SaveIO_Result := IO_Result ;
  921.        IF SaveIO_Result<>0 THEN GOTO 1 ;
  922.  
  923.        SEEK(HelpFv,1+(Mode+8)*21) ;
  924.        SaveIO_Result:=IO_Result ;
  925.        IF SaveIO_Result<>0 THEN GOTO 1 ;
  926.  
  927.        READ(HelpFv,OutStr) ;
  928.        SaveIO_Result:=IO_Result ;
  929.        IF SaveIO_Result<>0 THEN GOTO 1 ;
  930.        
  931.        
  932.        FOR i:=1 TO 20 DO
  933.            BEGIN
  934.              READ(HelpFv,OutStr) ;
  935.              SaveIO_Result:=IO_Result ;
  936.              IF SaveIO_Result<>0 THEN GOTO 1 ;
  937.              CRItem[13+i] := Add_DItem(CR, G_Text, 0,
  938.                                  1, i+1, 57, 1, -3, 4096 | 256 | 128);
  939.              Set_DText(CR, CRItem[13+i], OutStr, System_Font, TE_Left);
  940.            END ;
  941.  
  942.        CRScreen := Do_Dialog(CR, 0);
  943.  
  944.        WHILE CRScreen<>13 DO
  945.          BEGIN   
  946.            IF CRScreen>3 THEN
  947.               BEGIN
  948.                 IF CrScreen=12 THEN
  949.                    SEEK(HelpFv,1+(Mode+8)*21)
  950.                 ELSE 
  951.                    SEEK(HelpFv,1+(CRScreen-3)*21) ;
  952.                END
  953.            ELSE
  954.               SEEK(HelpFv,1) ;
  955.            SaveIO_Result:=IO_Result ;
  956.            IF SaveIO_Result<>0 THEN GOTO 1 ;
  957.  
  958.            READ(HelpFv,OutStr) ;
  959.            SaveIO_Result:=IO_Result ;
  960.            IF SaveIO_Result<>0 THEN GOTO 1 ;
  961.         
  962.            FOR i:=5 TO 24 DO
  963.                BEGIN
  964.                  READ(HelpFv,OutStr) ;
  965.                  SaveIO_Result:=IO_Result ;
  966.                  IF SaveIO_Result<>0 THEN GOTO 1 ;
  967.                 
  968.                  Draw_String(48,((i*8)-5)*RESOLUTION,OutStr) ;
  969.                END ; 
  970.  
  971.            Obj_SetState(CR,CRScreen,Normal,TRUE) ;           
  972.            CRScreen:=ReDo_Dialog(CR,0) ;
  973.          END ;
  974.  
  975. 1 :    IF SaveIO_Result<>0 THEN
  976.           DiskError(SaveIO_Result) ;              
  977.        IO_Check(TRUE) ;
  978.           
  979.        End_Dialog(CR);
  980.        Delete_Dialog(CR);
  981.        CLOSE(HelpFv) ;
  982.      end;
  983.  
  984. { *************************************************************************
  985.      MenuOption Selects or Deselects menu options that will or will not
  986.      be available for choice at any certain portion of the program.
  987.      Items that will not be available are displayed in shadow text and
  988.      Cannot be choosen with the mouse.
  989. ************************************************************************* }
  990.   procedure MenuOption ;
  991.  
  992.     var
  993.         i,
  994.         CurLoc   : short_integer ;
  995.         CurRec   : ScrPtr ;
  996.  
  997.      begin
  998.        for i := 1 to 24 do
  999.            Menu_Disable(InfoMenu, MenuItem.Item[i]) ;
  1000.         Case Mode of
  1001.            1 : begin
  1002.                  Menu_Enable(InfoMenu, MenuItem.Item[1]) ;
  1003.                  Menu_Enable(InfoMenu, MenuItem.Item[4]) ;
  1004.                  Menu_Enable(InfoMenu, MenuItem.Item[5]) ;
  1005.                  Menu_Enable(InfoMenu, MenuItem.Item[10]) ;
  1006.                  if S_FirstRec[ScrNum] <> nil then
  1007.                     begin
  1008.                       for i := 2 to 3 do
  1009.                           Menu_Enable(InfoMenu, MenuItem.Item[i]) ;
  1010.                       Menu_Enable(InfoMenu, MenuItem.Item[6]) ;
  1011.                       CheckCurLoc( CurLoc, CurRec, XCur, YCur, ScrNum ) ;
  1012.                       if CurLoc >= 0 then
  1013.                          begin
  1014.                            Menu_Disable(InfoMenu, MenuItem.Item[10]) ;
  1015.                            Menu_Enable(InfoMenu, MenuItem.Item[11]) ;
  1016.                            Menu_Enable(InfoMenu, MenuItem.Item[19]) ;
  1017.                          end ;
  1018.                     end ;
  1019.                end ;
  1020.            2 : begin
  1021.                  Menu_Enable(InfoMenu, MenuItem.Item[1]) ;
  1022.                  for i := 3 to 6 do
  1023.                      Menu_Enable(InfoMenu, MenuItem.Item[i]) ;
  1024.                  if TotalRec[DataNum] > 1 then
  1025.                     begin
  1026.                       Menu_Enable(InfoMenu, MenuItem.Item[2]) ;
  1027.                       for i := 7 to 9 do
  1028.                           Menu_Enable(InfoMenu, MenuItem.Item[i]) ;
  1029.                       if D_CurrentRec[DataNum] <> D_LastRec[DataNum] then
  1030.                          begin
  1031.                            Menu_Enable(InfoMenu, MenuItem.Item[14]) ;
  1032.                            Menu_Enable(InfoMenu, MenuItem.Item[17]) ;
  1033.                          end ;
  1034.                       if D_CurrentRec[DataNum] <> D_FirstRec[DataNum] then
  1035.                          for i := 15 to 16 do
  1036.                              Menu_Enable(InfoMenu, MenuItem.Item[i]) ;
  1037.                     end ;
  1038.                  Menu_Enable(InfoMenu, MenuItem.Item[19]) ;
  1039.                  if NOT FullMemory then
  1040.                     Menu_Enable(InfoMenu, MenuItem.Item[21]) ;
  1041.                  if (D_FirstRec[Report] <> nil) AND
  1042.                     (R_EditFlag OR R_LoadFlag) then
  1043.                     for i := 22 to 24 do
  1044.                         Menu_Enable(InfoMenu, MenuItem.Item[i]) ;
  1045.                end ;
  1046.            3 : if SearchFlag then
  1047.                   begin
  1048.                     Menu_Enable(InfoMenu, MenuItem.Item[6]) ;
  1049.                     Menu_Enable(InfoMenu, MenuItem.Item[12]) ;
  1050.                   end
  1051.                else
  1052.                   begin
  1053.                     Menu_Enable(InfoMenu, MenuItem.Item[2]) ;
  1054.                     Menu_Enable(InfoMenu, MenuItem.Item[6]) ;
  1055.                     Menu_Enable(InfoMenu, MenuItem.Item[7]) ;
  1056.                     Menu_Enable(InfoMenu, MenuItem.Item[9]) ;
  1057.                     if F_CurRec <> F_LastRec then
  1058.                        begin
  1059.                          Menu_Enable(InfoMenu, MenuItem.Item[14]) ;
  1060.                          Menu_Enable(InfoMenu, MenuItem.Item[17]) ;
  1061.                        end ;
  1062.                     if F_CurRec <> F_FirstRec then
  1063.                        for i := 15 to 16 do
  1064.                            Menu_Enable(InfoMenu, MenuItem.Item[i]) ;
  1065.                     Menu_Enable(InfoMenu, MenuItem.Item[19]) ;
  1066.                     if (D_FirstRec[Report] <> nil) AND
  1067.                        (R_EditFlag OR R_LoadFlag) then
  1068.                        for i := 22 to 24 do
  1069.                            Menu_Enable(InfoMenu, MenuItem.Item[i]) ;
  1070.                   end ;
  1071.            4 : begin
  1072.                  Menu_Enable(InfoMenu, MenuItem.Item[6]) ;
  1073.                  if F_FirstRec <> nil then
  1074.                     Menu_Enable(InfoMenu, MenuItem.Item[13]) ;
  1075.                end ;
  1076.            5 : begin
  1077.                  for i := 1 to 4 do
  1078.                      Menu_Enable(InfoMenu, MenuItem.Item[i]) ;
  1079.                  if F_FirstRec <> nil then
  1080.                     Menu_Enable(InfoMenu, MenuItem.Item[7])
  1081.                  else
  1082.                     if D_FirstRec[DataNum] <> nil then
  1083.                        Menu_Enable(InfoMenu, MenuItem.Item[6])
  1084.                     else
  1085.                        Menu_Enable(InfoMenu, MenuItem.Item[5]) ;
  1086.                  Menu_Enable(InfoMenu, MenuItem.Item[9]) ;
  1087.                  if R_EditFlag OR R_LoadFlag then
  1088.                     for i := 22 to 24 do
  1089.                         Menu_Enable(InfoMenu, MenuItem.Item[i]) ;
  1090.                end ;
  1091.            6 : begin
  1092.                  Menu_Enable(InfoMenu, MenuItem.Item[4]) ;
  1093.                  for i := 14 to 15 do
  1094.                      Menu_Enable(InfoMenu, MenuItem.Item[i]) ;
  1095.                end ;
  1096.         end ;
  1097.         
  1098.        for i := 5 to 9 do
  1099.            Menu_Check(InfoMenu, MenuItem.Item[i], false) ;
  1100.        Menu_Check(InfoMenu, MenuItem.Item[Mode + 4], true) ;
  1101.      end ;
  1102.  
  1103. { *************************************************************************
  1104.      SetUpMenu creates and then displays the main menu of InfoBaseST.
  1105. ************************************************************************* }
  1106.   procedure SetUpMenu;
  1107.  
  1108.      begin
  1109.        With MenuItem do
  1110.          begin
  1111.            InfoMenu := New_Menu(25, '  InfoBase ST  ');
  1112.   
  1113.            Title[1] := Add_MTitle(InfoMenu, ' File    ');
  1114.            Title[2] := Add_MTitle(InfoMenu, ' Mode    ');
  1115.            Title[3] := Add_MTitle(InfoMenu, ' Design  ');
  1116.            Title[4] := Add_MTitle(InfoMenu, ' Record  ');
  1117.            Title[5] := Add_MTitle(InfoMenu, ' Output  ');
  1118.  
  1119.            Item[1]  := Add_MItem(InfoMenu, Title[1], ' ^O - Open  ') ;
  1120.            Item[2]  := Add_MItem(InfoMenu, Title[1], ' ^S - Save  ') ;
  1121.            Item[3]  := Add_MItem(InfoMenu, Title[1], ' ^C - Clear ') ;
  1122.            Item[4]  := Add_MItem(InfoMenu, Title[1], ' ^Q - Quit  ') ;
  1123.   
  1124.            Item[5]  := Add_MItem(InfoMenu, Title[2], '  alt-D: Design ') ;
  1125.            Item[6]  := Add_MItem(InfoMenu, Title[2], '  alt-I: Input  ') ;
  1126.            Item[7]  := Add_MItem(InfoMenu, Title[2], '  alt-F: Search ') ;
  1127.            Item[8]  := Add_MItem(InfoMenu, Title[2], '  alt-S: Sort   ') ;
  1128.            Item[9]  := Add_MItem(InfoMenu, Title[2], '  alt-O: Output ') ;
  1129.  
  1130.            Item[10] := Add_MItem(InfoMenu, Title[3], ' ^E - Enter  ') ;
  1131.            Item[11] := Add_MItem(InfoMenu, Title[3], ' ^M - Modify ') ;
  1132.  
  1133.            Item[12] := Add_MItem(InfoMenu, Title[4], ' alt-F  Search   ') ;
  1134.            Item[13] := Add_MItem(InfoMenu, Title[4], ' alt-S  Sort     ') ;
  1135.            Item[14] := Add_MItem(InfoMenu, Title[4], '  Sh->  Next     ') ;
  1136.            Item[15] := Add_MItem(InfoMenu, Title[4], '  Sh<-  Previous ') ;
  1137.            Item[16] := Add_MItem(InfoMenu, Title[4], '  ^<-   FirstRec ') ;
  1138.            Item[17] := Add_MItem(InfoMenu, Title[4], '  ^->   Last Rec ') ;
  1139.            Item[18] := Add_MItem(InfoMenu, Title[4], '-----------------') ;
  1140.            Item[19] := Add_MItem(InfoMenu, Title[4], '   ^D   Delete   ') ;
  1141.            Item[20] := Add_MItem(InfoMenu, Title[4], '-----------------') ;
  1142.            Item[21] := Add_MItem(InfoMenu, Title[4], '   Tab  New Rec  ') ;
  1143.  
  1144.            Item[22] := Add_MItem(InfoMenu, Title[5], '   Print  ') ;
  1145.            Item[23] := Add_MItem(InfoMenu, Title[5], '   Disk   ') ;
  1146.            Item[24] := Add_MItem(InfoMenu, Title[5], '   Screen ') ;
  1147.  
  1148.          end;
  1149.        MenuOption ;
  1150.        Draw_Menu(InfoMenu);
  1151.     end;
  1152.  
  1153. { *************************************************************************
  1154.      ExitProgram closes and deletes all open windows and sets ExitPrompt
  1155.      to true to exit the main loop in the main module.
  1156. ************************************************************************* }
  1157.   procedure ExitProgram ;
  1158.  
  1159.      begin
  1160.        ExitPrompt := true ; 
  1161.        SaveDecision(Result) ;
  1162.        if Result <> 3 then
  1163.           D_SaveDecision(Result) ;
  1164.        if (Result <> 3) AND (R_EditFlag) then
  1165.           R_SaveDecision(Result) ;
  1166.        if Result <> 3 then
  1167.           begin
  1168.             if D_FirstRec[DataNum] <> nil then
  1169.                D_DisposeRecs(D_FirstRec[DataNum], D_CurrentRec[DataNum],
  1170.                              D_LastRec[DataNum]) ;
  1171.             Close_Window(WindNum) ;
  1172.             Delete_Window(WindNum) ;
  1173.             WindNum := -1 ;
  1174.           end
  1175.        else
  1176.           ExitPrompt := false ; 
  1177.      end ;
  1178.  
  1179. { *************************************************************************
  1180.      Allows the user to modify a Screen Info field after it has been 
  1181.      Entered.  Called via menu or ^M while cursor is positioned on the
  1182.      field to be altered.
  1183. ************************************************************************* }
  1184.   procedure ModifyScrn( Var CurRec : ScrPtr ; Var OverLap : boolean ) ;
  1185.  
  1186.     var
  1187.         TotalOffset : short_integer ;
  1188.         ScrRec      : ScrPtr ;
  1189.         NewRec    : ScrPtr ;
  1190.         TitleStr  : Str255 ;
  1191.         Result,
  1192.         ExitFlag  : boolean ;
  1193.         i,
  1194.         CurLoc    : short_integer ;
  1195.         NewMode   : short_integer ;
  1196.         Offset    : short_integer ;
  1197.         OldDataType,
  1198.         NewDataType : char ;
  1199.  
  1200. { *************************************************************************
  1201.        Delete a Screen Info field from the current design screen.
  1202. ************************************************************************* }
  1203.      procedure DeleteScrRec ;
  1204.  
  1205.        var
  1206.           TotalOffset : short_integer ;
  1207.           ScrRec      : ScrPtr ;
  1208.  
  1209.         begin
  1210.           Hide_Mouse ;
  1211.           DeleteARec(CurRec) ;
  1212.         { Recalculate Offsets  }
  1213.           ScrRec := S_FirstRec[ScrNum] ;
  1214.           TotalOffset := 0 ;
  1215.           While ScrRec <> nil do
  1216.             begin
  1217.               ScrRec^.Offset := TotalOffset ;
  1218.               TotalOffset := TotalOffset + ScrRec^.Size ;
  1219.               ScrRec := ScrRec^.Next ;
  1220.             end ;
  1221.           DrawScreen(S_FirstRec[ScrNum]) ;
  1222.           Show_Mouse ;
  1223.         end ;
  1224.  
  1225.  
  1226.      begin
  1227.        ExitFlag := false ;
  1228.        D_EditFlag[ScrNum] := true ;
  1229.        Repeat
  1230.          EraseARec(CurRec) ;
  1231.          TitleStr := CurRec^.LabelStr ;
  1232.          OldDataType := CurRec^.DataType ;
  1233.          if OverLap then
  1234.             AcceptTitle('Field Overlap', TitleStr, CurRec^.Size,
  1235.                          CurRec^.X, CurRec^.Y, CurRec^.DataType, Result) 
  1236.          else
  1237.             AcceptTitle('Modify Title', TitleStr, CurRec^.Size,
  1238.                          CurRec^.X, CurRec^.Y, CurRec^.DataType, Result) ;
  1239.          NewDataType := CurRec^.DataType ;
  1240.          if Result then
  1241.             begin
  1242.               if (NewDataType = 'H') AND (NewDataType <> OldDataType) then
  1243.                  begin
  1244.                    new(NewRec) ;
  1245.                    NewRec^.LabelStr := '' ;
  1246.                    NewRec^.DataType := 'D' ;
  1247.                    NewRec^.X := 1 + XCur + CurRec^.Size + 
  1248.                                     Length(CurRec^.LabelStr) ;
  1249.                    NewRec^.Y := YCur ;
  1250.                    NewRec^.Size := 1 ;
  1251.                    NewRec^.XInPos := 0 ; 
  1252.                    NewRec^.XPos   := NewRec^.X + 3 ;
  1253.                    NewRec^.YPos   := YCur ;
  1254.                    
  1255.                    if CurRec^.Next <> nil then
  1256.                       CurRec^.Next^.Prev := NewRec ;
  1257.                    NewRec^.Next := CurRec^.Next ;
  1258.                    CurRec^.Next := NewRec ;
  1259.                    NewRec^.Prev := CurRec ;
  1260.                    
  1261.                  { Recalculate Offsets  }
  1262.                    ScrRec := S_FirstRec[ScrNum] ;
  1263.                    TotalOffset := 0 ;
  1264.                    While ScrRec <> nil do
  1265.                      begin
  1266.                        ScrRec^.Offset := TotalOffset ;
  1267.                        TotalOffset := TotalOffset + ScrRec^.Size ;
  1268.                        ScrRec := ScrRec^.Next ;
  1269.                      end ;
  1270.                  end
  1271.               else
  1272.                  if (OldDataType = 'H') AND (NewDataType <> 'H') then
  1273.                     DeleteARec(CurRec^.Next) ;
  1274.               CurRec^.LabelStr := TitleStr ;
  1275.               XCur := CurRec^.X ;
  1276.               YCur := CurRec^.Y ;
  1277.               CurRec^.XInPos := 0 ;
  1278.               CurRec^.XPos   := XCur + Length(TitleStr) + 3 ; 
  1279.               CurRec^.YPos   := YCur ;
  1280.               CalcOffset( S_FirstRec[ScrNum], CurRec, Offset ) ;
  1281.               CurRec^.Offset := Offset ;
  1282.               CheckOverLap( CurRec, CurRec^.X, CurRec^.Y, OverLap ) ;
  1283.             end 
  1284.          else
  1285.             begin
  1286.               ExitFlag := true ;
  1287.               OverLap := true ;
  1288.               DeleteScrRec ;
  1289.             end ;
  1290.  
  1291.          if NOT OverLap then
  1292.             begin
  1293.               Set_Clip(0,0,640,200 * Resolution) ;
  1294.               if CurRec^.DataType = 'H' then
  1295.                  begin
  1296.                    CurRec^.Next^.Y := CurRec^.Y ; 
  1297.                    CurRec^.Next^.X :=                                  { 2 }
  1298.                            CurRec^.X + CurRec^.Size + Length(TitleStr) + 1 ; 
  1299.                    CurRec^.Next^.YPos := CurRec^.YPos ; 
  1300.                    CurRec^.Next^.XPos :=                               { 5 }
  1301.                            CurRec^.X + CurRec^.Size + Length(TitleStr) + 4 ; 
  1302.                  end ;
  1303.               DrawScreen(S_FirstRec[ScrNum]) ;
  1304.               ShortDraw := true ;
  1305.             end
  1306.          else
  1307.             if Result then
  1308.             begin
  1309.               if CurRec^.Y < 14 then
  1310.                  repeat
  1311.                    CurRec^.Y := CurRec^.Y + 1 ; 
  1312.                    CheckOverlap( CurRec, CurRec^.X, CurRec^.Y, OverLap ) ;
  1313.                  Until NOT OverLap OR (CurRec^.Y > 14) ;
  1314.                  
  1315.               AlertStr := '[2][  |  Altering Position of Field  | ' ;
  1316.               AlertStr := Concat(AlertStr, '|     Modify if Desired|  ]') ;
  1317.               AlertStr := Concat(AlertStr, '[ Continue]') ;
  1318.               i        := Do_Alert(AlertStr,1) ;
  1319.             end ;
  1320.        Until NOT OverLap OR ExitFlag ;
  1321.      end ;
  1322.  
  1323. { *************************************************************************
  1324.      Calls ModifyScrn if the cursor is positioned on a current Screen
  1325.      Info field.  Otherwise displays an error message.
  1326. ************************************************************************* }
  1327.   procedure Select_Modify ;
  1328.  
  1329.     var
  1330.         CurLoc   : short_integer ;
  1331.         CurRec   : ScrPtr ;
  1332.         OverLap  : boolean ;
  1333.  
  1334.      begin
  1335.        OverLap := false ;
  1336.        CheckCurLoc( CurLoc, CurRec, XCur, YCur, ScrNum ) ;
  1337.        if CurLoc > -1 then
  1338.           if CurRec^.DataType <> 'D' then
  1339.              ModifyScrn(CurRec, OverLap) ;
  1340.      end ;
  1341.  
  1342. { *************************************************************************
  1343.      Allows the creation of a Screen Info field on the screen.  Issues
  1344.      and error message if the cursor is overlapping an existing
  1345.      field.
  1346. ************************************************************************* }
  1347.   procedure Select_Enter ;
  1348.  
  1349.     var
  1350.         DataType : char ;
  1351.         Size,
  1352.         A_Result : short_integer ;
  1353.         TitleStr : Str255 ;
  1354.         Result   : boolean ;
  1355.         Overlap  : boolean ;
  1356.         CurLoc   : short_integer ;
  1357.         CurRec   : ScrPtr ;
  1358.  
  1359.      begin
  1360.        CheckCurLoc( CurLoc, CurRec, XCur, YCur, ScrNum ) ;
  1361.        if CurLoc < 0 then
  1362.           begin
  1363.             Size := 10 ;
  1364.             AcceptTitle('Enter Title', TitleStr, 
  1365.                          Size, XCur, YCur, DataType, Result) ;
  1366.  
  1367.             if Result then
  1368.                begin
  1369.                  Set_Clip(0,0,640,200 * Resolution) ;
  1370.                  D_EditFlag[ScrNum] := true ;
  1371.                  AddARec(S_FirstRec[ScrNum], S_CurrentRec[ScrNum],
  1372.                          S_LastRec[ScrNum], S_LastRec[ScrNum], TitleStr, 
  1373.                          XCur, YCur, Size, DataType, ScrNum ) ;
  1374.                  CheckOverLap(S_CurrentRec[ScrNum], 
  1375.                               S_CurrentRec[ScrNum]^.X,
  1376.                               S_CurrentRec[ScrNum]^.Y, OverLap ) ;
  1377.                  if Overlap then
  1378.                     ModifyScrn(S_CurrentRec[ScrNum], OverLap) ;
  1379.                  if DataType = 'H' then
  1380.                     AddARec(S_FirstRec[ScrNum], S_CurrentRec[ScrNum],
  1381.                             S_LastRec[ScrNum], S_LastRec[ScrNum], '', 
  1382.                             XCur + Size + Length(TitleStr) + 1, YCur, 
  1383.                             1, 'D', ScrNum) ;
  1384.                  DrawScreen(S_FirstRec[ScrNum]) ;
  1385.                  ShortDraw := true ;
  1386.                  if YCur < 14 then YCur := YCur + 1 ;
  1387.                end ;
  1388.           end
  1389.        else
  1390.           begin
  1391.             AlertStr := '[1][  |Record Overlap|  ]' ;
  1392.             AlertStr := Concat(AlertStr, '[ Continue ]') ;
  1393.             A_Result   := Do_Alert(AlertStr,1) ;
  1394.           end ;
  1395.      end ;
  1396.  
  1397. { *************************************************************************
  1398.        Process the changes necessary when changing between modes.
  1399. ************************************************************************* }
  1400.      procedure ChangeMode( Var Mode, NewMode : short_integer ) ;
  1401.      
  1402.         begin
  1403.           if NewMode = 5 then
  1404.              begin
  1405.                Mode := 5 ;
  1406.                Spacing := 10 * Resolution ;
  1407.                DrawScreen(S_CurrentRec[ScrNum]) ;
  1408.              end ;
  1409.  
  1410.           if (NewMode = 1) AND (Mode <> 5) then
  1411.              SaveDecision(Result)
  1412.           else
  1413.              Result := 2 ;
  1414.           if Result <> 3 then
  1415.              begin
  1416.                if (NewMode = 1) AND (Mode <> 5) then
  1417.                   begin
  1418.                     ClearRecord(D_CurrentRec[DataNum]) ;
  1419.                     D_DisposeRecs(D_FirstRec[DataNum], D_CurrentRec[DataNum],
  1420.                                   D_LastRec[DataNum]) ;
  1421.                     RecNo[DataNum] := 0 ;
  1422.                   end
  1423.                else
  1424.                   if (NewMode = 1) AND (Mode = 5) then
  1425.                      begin
  1426.                        Mode := 1 ;
  1427.                        Spacing := 12 * Resolution ;
  1428.                        ClrHome ;
  1429.                        DrawScreen(S_FirstRec[ScrNum]) ;
  1430.                      end ;
  1431.  
  1432.                if (NewMode = 2) AND (Mode = 3) then
  1433.                   begin
  1434.                     if SearchFlag then
  1435.                        begin
  1436.                          SearchFlag := false ;
  1437.                          DS_DeleteARec(D_CurrentRec[DataNum]) ;
  1438.                          D_CurrentRec[DataNum] := D_FirstRec[DataNum] ;
  1439.                          RecNo[DataNum] := 1 ;
  1440.                        end ;
  1441.                     FormatCheck(D_CurrentRec[DataNum]) ;
  1442.                     DisposeInt(C_FirstRec, C_CurRec, C_LastRec) ;
  1443.                     DisposeInt(F_FirstRec, F_CurRec, F_LastRec) ;
  1444.                     F_SaveRec := nil ;
  1445.                     ClrHome ;
  1446.                     DrawRecord(D_CurrentRec[DataNum]) ;
  1447.                   end ;
  1448.  
  1449.                if (NewMode = 2) AND (Mode = 4) then
  1450.                   begin
  1451.                     if SortFlag then
  1452.                        begin
  1453.                          SortFlag := false ;
  1454.                          DS_DeleteARec(D_CurrentRec[DataNum]) ;
  1455.                          D_CurrentRec[DataNum] := D_FirstRec[DataNum] ;
  1456.                          RecNo[DataNum] := 1 ;
  1457.                        end ;
  1458.                     DisposeInt(F_FirstRec, F_CurRec, F_LastRec) ;
  1459.                     ClrHome ;
  1460.                     DrawRecord(D_CurrentRec[DataNum]) ;
  1461.                   end ;
  1462.  
  1463.                if ((NewMode = 2) OR (NewMode = 3)) AND (Mode = 5) then
  1464.                   begin
  1465.                     Mode := 2 ;
  1466.                     Spacing := 12 * Resolution ;
  1467.                     ClrHome ;
  1468.                     DrawScreen(S_FirstRec[ScrNum]) ;
  1469.                     DrawRecord(D_CurrentRec[DataNum]) ;
  1470.                   end ;
  1471.  
  1472.  
  1473.                Mode := NewMode ;
  1474.                UpdateFlag := true ; ;
  1475.                Set_VSlideSize ;
  1476.              end ;
  1477.         end ;
  1478. { *************************************************************************
  1479.      Process the Input request.
  1480. ************************************************************************* }
  1481.      procedure SelectInput( Var NewMode : short_integer ) ;
  1482.  
  1483.         begin
  1484.           if S_CurrentRec[ScrNum] <> nil then
  1485.              begin
  1486.                NewMode := 2 ;
  1487.                if Mode = 1 then
  1488.                   begin
  1489.                     CreateDataRec(DataNum) ;
  1490.                     RecNo[DataNum] := 1 ;
  1491.                     S_CurrentRec[ScrNum] := S_FirstRec[ScrNum] ;
  1492.                     S_CurrentRec[ScrNum]^.XInPos := 0 ;
  1493.                     XCur := S_CurrentRec[ScrNum]^.XPos ;
  1494.                     YCur := S_CurrentRec[ScrNum]^.YPos ;
  1495.                   end ;
  1496.              end 
  1497.           else
  1498.              begin
  1499.                AlertStr := '[2][| No Data Base Design | ' ;
  1500.                AlertStr := Concat(AlertStr, '|   has been entered  |  ]') ;
  1501.                AlertStr := Concat(AlertStr, '[ Continue ]') ;
  1502.                Result   := Do_Alert(AlertStr,1) ;
  1503.              end ;
  1504.         end ;
  1505.  
  1506.  
  1507. { *************************************************************************
  1508.        Determines which Open module to call depending upon the 
  1509.        current mode.
  1510. ************************************************************************* }
  1511.      procedure Select_Open(Var NewMode : short_integer) ;
  1512.  
  1513.        var
  1514.           CurRec  : DataPtr ;
  1515.           DataRec : DataStorePtr ;
  1516.           Flag    : boolean ;
  1517.  
  1518.         begin
  1519.           Case Mode of
  1520.               1 : begin
  1521.                     Result := 1 ;
  1522.                     if D_EditFlag[ScrNum] then
  1523.                        D_SaveDecision(Result) ;
  1524.                     if Result <> 3 then
  1525.                        begin
  1526.                          OpenScrnInfo(Flag) ;
  1527.                          if Flag then
  1528.                             begin
  1529.                               CurRec := D_FirstRec[Report] ;
  1530.                               While CurRec <> nil do
  1531.                                 begin
  1532.                                   DataRec := D_FirstRec[Report]^.Data ;
  1533.                                   While DataRec <> nil do
  1534.                                     begin
  1535.                                       FillString(DataRec^.DataStr, chr($20)) ;
  1536.                                       DataRec := DataRec^.Next ;
  1537.                                     end ;
  1538.                                   CurRec := CurRec^.Next ;
  1539.                                 end ;
  1540.                               ClrHome ;
  1541.                             end ;
  1542.                        end ;
  1543.                   end ;
  1544.               2 : begin
  1545.                     SaveDecision(Result) ;
  1546.                     if Result <> 3 then
  1547.                        begin
  1548.                          if (D_FirstRec[DataNum] <> nil) AND 
  1549.                             (D_FirstRec[DataNum] = D_LastRec[DataNum]) AND
  1550.                              NOT EditFlag[ScrNum] then
  1551.                              Result := 2
  1552.                          else
  1553.                             MergeDecision(Result) ;
  1554.                          if Result = 1 then
  1555.                             begin
  1556.                               MergeDataBase ;
  1557.                               EditFlag[ScrNum] := true ;
  1558.                             end 
  1559.                          else
  1560.                             if Result = 2 then
  1561.                                begin
  1562.                                  GetDataBase ;
  1563.                                  EditFlag[ScrNum] := false ;
  1564.                                end ;
  1565.                          ClrHome ;
  1566.                        end ;
  1567.                   end ;
  1568.               5 : begin
  1569.                     Result := 1 ;
  1570.                     if R_EditFlag then
  1571.                        R_SaveDecision(Result) ;
  1572.                     if Result <> 3 then
  1573.                        begin
  1574.                          GetPrtInfo ;
  1575.                          DrawDesign ;
  1576.                          ShortDraw := true ;
  1577.                        end ;
  1578.                   end ;
  1579.           end ;
  1580.           if (Mode = 1) AND (Result <> 3) AND (Flag) then
  1581.              SelectInput(NewMode) ;
  1582.         end ;
  1583.  
  1584. { *************************************************************************
  1585.        Determine the proper save module to call depending upon the
  1586.        current mode.
  1587. ************************************************************************* }
  1588.      procedure Select_Save ;
  1589.  
  1590.         begin
  1591.           Case Mode of
  1592.               1 : SaveScrnInfo ;
  1593.             2,3 : begin
  1594.                     FormatCheck(D_CurrentRec[DataNum]) ;
  1595.                     SaveDataBase(DataNum) ;
  1596.                   end ;
  1597.               5 : SavePrtInfo ;
  1598.           end ;
  1599.         end ;
  1600.  
  1601. { *************************************************************************
  1602.      Process the Close request.  Different results depending upon MODE.
  1603. ************************************************************************* }
  1604.      procedure Select_Close ;
  1605.  
  1606.        var
  1607.           CurRec  : DataPtr ;
  1608.           DataRec : DataStorePtr ;
  1609.  
  1610.         begin
  1611.           Case Mode of
  1612.               1 : begin
  1613.                     Result := 1 ;
  1614.                     if D_EditFlag[ScrNum] then
  1615.                        D_SaveDecision(Result) ;
  1616.                     if Result <> 3 then
  1617.                        begin
  1618.                          DisposeRecs(S_FirstRec[ScrNum], S_CurrentRec[ScrNum],
  1619.                                      S_LastRec[ScrNum]) ;
  1620.                          DrawScreen(S_FirstRec[ScrNum]) ;
  1621.                          XCur := 1 ;
  1622.                          YCur := 1 ;
  1623.                        end ;
  1624.                   end ;
  1625.               2 : begin
  1626.                     SaveDecision(Result) ;
  1627.                     if Result <> 3 then
  1628.                        begin
  1629.                          EditFlag[ScrNum] := false ;
  1630.                          D_DisposeRecs(D_FirstRec[DataNum], 
  1631.                               D_CurrentRec[DataNum], D_LastRec[DataNum]) ;
  1632.                          RecNo[DataNum] := 0 ;
  1633.                          TotalRec[DataNum] := 0 ;
  1634.                          CreateDataRec(DataNum) ;
  1635.                          ClrHome ;
  1636.                          DrawScreen(S_FirstRec[ScrNum]) ;
  1637.                        end ;
  1638.                   end ;
  1639.               5 : begin
  1640.                     Result := 1 ;
  1641.                     if R_EditFlag then
  1642.                        R_SaveDecision(Result) ;
  1643.                     if Result <> 3 then
  1644.                        begin
  1645.                          CurRec := D_FirstRec[Report] ;
  1646.                          While CurRec <> nil do
  1647.                            begin
  1648.                              DataRec := D_FirstRec[Report]^.Data ;
  1649.                              While DataRec <> nil do
  1650.                                begin
  1651.                                  FillString(DataRec^.DataStr, chr($20)) ;
  1652.                                  DataRec := DataRec^.Next ;
  1653.                                end ;
  1654.                              CurRec := CurRec^.Next ;
  1655.                            end ;
  1656.                          R_LoadFlag := false ;
  1657.                          DrawDZ_Out ;
  1658.                        end ;
  1659.                   end ;
  1660.           end ;
  1661.           ModifyWName ;
  1662.           UpdateFlag := true ; ;
  1663.         end ;
  1664.  
  1665. { *************************************************************************
  1666.      Process the Search Request.
  1667. ************************************************************************* }
  1668.      procedure SelectSearch( Var NewMode : short_integer ) ;
  1669.  
  1670.        var
  1671.           ScrRec : ScrPtr ;
  1672.           Result : short_integer ;
  1673.  
  1674.         procedure SearchSetUp ;
  1675.  
  1676.            begin 
  1677.              FormatCheck(D_CurrentRec[DataNum]) ;
  1678.              SearchFlag := true ;
  1679.              if F_FirstRec = nil then
  1680.                 begin
  1681.                   F_TotalRec[DataNum] := 0 ;
  1682.                   F_RecNo[DataNum] := 0 ;
  1683.                     
  1684.                   ScrRec := S_FirstRec[ScrNum] ;
  1685.                   While ScrRec <> nil do
  1686.                      begin
  1687.                        Int_AddARec(C_FirstRec,C_CurRec,C_LastRec, 1) ;
  1688.                        ScrRec := ScrRec^.Next ;
  1689.                      end ;
  1690.                   C_CurRec := C_FirstRec ;
  1691.                   
  1692.                   NewMode := 3 ;
  1693.                end ;
  1694.              ClearRecord(D_CurrentRec[DataNum]) ;
  1695.              CreateDataRec(DataNum) ;
  1696.              ClrHome ;
  1697.            end ;
  1698.  
  1699.      procedure DeleteDupRecs ; 
  1700.  
  1701.        var
  1702.           CurRec_1,
  1703.           CurRec_2,
  1704.           NilRec_1,
  1705.           NilRec_2,
  1706.           NewListFirst,
  1707.           NewListCur,
  1708.           NewListLast   : IntPtr ;
  1709.           
  1710.        begin
  1711.           CurRec_1   := F_FirstRec ;
  1712.           CurRec_2   := F_SaveRec^.Next ;
  1713.           NewListFirst := nil ;
  1714.           NewListCur   := nil ;
  1715.           NewListLast  := nil ;
  1716.           
  1717.           new(NilRec_1) ;
  1718.           NilRec_1^.Match := MaxInt ;
  1719.           new(NilRec_2) ;
  1720.           NilRec_2^.Match := MaxInt ;
  1721.           
  1722.           While (CurRec_1 <> NilRec_1) OR (CurRec_2 <> NilRec_2) do
  1723.             begin
  1724.               if CurRec_1^.Match < CurRec_2^.Match then
  1725.                  begin
  1726.                    Int_AddARec(NewListFirst, NewListCur, NewListLast, 
  1727.                                CurRec_1^.Match) ;
  1728.                    CurRec_1 := CurRec_1^.Next ;
  1729.                  end
  1730.               else
  1731.                  if CurRec_1^.Match > CurRec_2^.Match then
  1732.                     begin
  1733.                       Int_AddARec(NewListFirst, NewListCur, NewListLast, 
  1734.                                   CurRec_2^.Match) ;
  1735.                       CurRec_2 := CurRec_2^.Next ;
  1736.                     end
  1737.                  else
  1738.                     begin
  1739.                       Int_AddARec(NewListFirst, NewListCur, NewListLast, 
  1740.                                   CurRec_1^.Match) ;
  1741.                       CurRec_1 := CurRec_1^.Next ;
  1742.                       CurRec_2 := CurRec_2^.Next ;
  1743.                     end ;
  1744.               if CurRec_1 = F_SaveRec^.Next then
  1745.                  CurRec_1 := NilRec_1 ;
  1746.               if CurRec_2 = nil then
  1747.                  CurRec_2 := NilRec_2 ;
  1748.             end ;
  1749.             
  1750.           DisposeInt(F_FirstRec, F_CurRec, F_LastRec) ;
  1751.           
  1752.           F_FirstRec := NewListFirst ;
  1753.           F_CurRec   := NewListFirst ;
  1754.           F_LastRec  := NewListLast ;
  1755.           F_SaveRec  := NewListLast ;
  1756.  
  1757.           F_TotalRec[DataNum] := 0 ;
  1758.           While F_CurRec <> nil do
  1759.              begin
  1760.                F_TotalRec[DataNum] := F_TotalRec[DataNum] + 1 ;
  1761.                F_CurRec := F_CurRec^.Next ;
  1762.              end ;
  1763.           F_CurRec := F_FirstRec ;
  1764.           
  1765.           CurRec_1 := nil ;
  1766.           CurRec_2 := nil ;
  1767.           NilRec_1 := nil ;
  1768.           NilRec_2 := nil ;
  1769.           
  1770.           NewListFirst := nil ;
  1771.           NewListCur   := nil ;
  1772.           NewListLast  := nil ;
  1773.  
  1774.           F_CurRec := F_LastRec ;
  1775.           GoToFirst(D_CurrentRec[DataNum], false ) ;
  1776.        end ;
  1777.  
  1778.         begin
  1779.           F_SaveRec := F_LastRec ;
  1780.           if Mode <> 5 then
  1781.              begin
  1782.                if NOT SearchFlag then
  1783.                   begin
  1784.                     if Mode <> 3 then
  1785.                        SearchSetUp
  1786.                     else
  1787.                        begin
  1788.                          AlertStr := '[2][  |        Search         | ' ;
  1789.                          AlertStr := Concat(AlertStr, 
  1790.                                           ' |      Disposition      |  ]') ;
  1791.                          AlertStr := Concat(AlertStr, 
  1792.                                      '[  OR  |  NEW  | Cancel ]') ;
  1793.                          Result   := Do_Alert(AlertStr,2) ;
  1794.                          if Result = 1 then
  1795.                             SearchSetUp            { OR SEARCH }
  1796.                          else
  1797.                             if Result = 2 then
  1798.                                begin
  1799.                                  NewMode := 2 ;
  1800.                                  ChangeMode(Mode, NewMode) ;
  1801.                                  SearchSetUp ;    { NEW SEARCH }
  1802.                                  Mode := 3 ;
  1803.                                end ;
  1804.                        end ;
  1805.                   end
  1806.                else
  1807.                   begin
  1808.                     SearchDataBase(NewMode) ;
  1809.                     SearchFlag := false ;
  1810.                     if F_SaveRec <> nil then
  1811.                        DeleteDupRecs ; 
  1812.                     ClrHome ;
  1813.                     DrawRecord(D_CurrentRec[DataNum]) ;
  1814.                     UpdateFlag := true ; ;
  1815.                     Set_VSlideSize ;
  1816.                   end ;
  1817.              end 
  1818.           else
  1819.              begin
  1820.                NewMode := 3 ;
  1821.                ClrHome ;
  1822.              end ;
  1823.         end ;
  1824.  
  1825. { *************************************************************************
  1826.      Process the Sort Request.
  1827. ************************************************************************* }
  1828.      procedure SelectSort( Var NewMode : short_integer ) ;
  1829.  
  1830.         begin
  1831.           if NOT SortFlag then
  1832.              begin
  1833.                FormatCheck(D_CurrentRec[DataNum]) ;
  1834.                SortFlag := true ;
  1835.                SortCount := 1 ;
  1836.                NewMode := 4 ;
  1837.                ClearRecord(D_CurrentRec[DataNum]) ;
  1838.                CreateDataRec(DataNum) ;
  1839.                ClrHome ;
  1840.              end
  1841.           else
  1842.              if F_FirstRec <> nil then
  1843.                 begin
  1844.                   SortFlag := false ;
  1845.                   UpdateInfoLine ;
  1846.                   SortRecords(D_FirstRec[DataNum], NewMode) ;
  1847.                   DisposeInt(F_FirstRec, F_CurRec, F_LastRec) ;
  1848.                   DisposeInt(C_FirstRec, C_CurRec, C_LastRec) ;
  1849.                 end ;
  1850.         end ;
  1851.  
  1852. { *************************************************************************
  1853.      Process the Report Design Request.
  1854. ************************************************************************* }
  1855.   procedure SelectOutput(Var NewMode : short_integer) ;
  1856.   
  1857.     var
  1858.        i      : short_integer ;
  1859.        ScrRec : ScrPtr ;
  1860.        AbortFlag : boolean ;
  1861.  
  1862.      begin
  1863.        NewMode := 5 ;
  1864.        if D_FirstRec[Report] = nil then
  1865.           begin
  1866.             for i := 1 to 10 do
  1867.                 AddARec(S_FirstRec[Report], S_CurrentRec[Report],
  1868.                         S_LastRec[Report], S_LastRec[Report], 
  1869.                         '', 1, i + 7, 132, 'A', Report) ;
  1870.             CreateDataRec(Report) ;
  1871.           end ;
  1872.        S_CurrentRec[Report] := S_FirstRec[Report] ;
  1873.  
  1874.        ScrRec := S_FirstRec[ScrNum] ;
  1875.        TotScrRec := 0 ;
  1876.        While ScrRec <> nil do
  1877.           begin
  1878.             TotScrRec := TotScrRec + 1 ;
  1879.             ScrRec := ScrRec^.Next ;
  1880.           end ;
  1881.  
  1882.        XCur := 1 ;
  1883.        YCur := 8 ;
  1884.        RW_Offset := 0 ;
  1885.        ReportSetUp(AbortFlag) ;
  1886.        if AbortFlag AND (Mode <> 5) then
  1887.           begin
  1888.             if F_FirstRec <> nil then
  1889.                NewMode := 3
  1890.             else
  1891.                NewMode := 2 ;
  1892.             ClrHome ;
  1893.             DrawScreen(S_CurrentRec[ScrNum]) ;
  1894.             DrawRecord(D_CurrentRec[DataNum]) ;
  1895.           end ;
  1896.      end ;
  1897.  
  1898. { *************************************************************************
  1899. ************************************************************************* }
  1900.    procedure SelectDelete ;
  1901.       
  1902.       begin
  1903.         if Mode = 1 then
  1904.            DeleteScrRec
  1905.         else
  1906.            DeleteRecord ;
  1907.       end ;
  1908. { *************************************************************************
  1909. ************************************************************************* }
  1910.   procedure SelectPrint( PrintMode : short_integer ) ;
  1911.  
  1912.   procedure PrintRep(Var PrintXs : short_integer ;
  1913.                      Var AbortFlag : boolean ) ;
  1914.  
  1915.     Var
  1916.        Print       : Dialog_Ptr;
  1917.        PrintScreen : Tree_Index;
  1918.        PrintItem   : array[1..23] of short_integer;
  1919.        GetEditStr  : Str255 ;
  1920.  
  1921.      begin
  1922.        Print := New_Dialog(3, 0, 0, 30, 10);
  1923.        Center_Dialog(Print);
  1924.  
  1925.        PrintItem[1] := Add_DItem(Print, G_BoxText, 0, 
  1926.                                5, 1, 22, 1, -1, 4096 | 256 | 128);
  1927.        Set_DText(Print, PrintItem[1], ' Report Repetitions ' ,
  1928.                  System_Font, TE_Center);
  1929.  
  1930.        PrintItem[2] := Add_DItem(Print, G_FText, Editable,
  1931.                                  7, 4, 16, 1, 0, 256 | 128);
  1932.        Set_DEdit(Print, PrintItem[2], 'Repetetions  ___', 
  1933.                                   '999', 
  1934.                                   '  1', System_Font, TE_Center);
  1935.  
  1936.        PrintItem[3] := Add_DItem(Print, G_BoxText,
  1937.                                  Default | Exit_Btn | Selectable,
  1938.                                  3, 7, 10, 1, -3, 4096 | 256 | 128);
  1939.        Set_DText(Print, PrintItem[3], 
  1940.                                  'Continue', System_Font, TE_Center);
  1941.  
  1942.        PrintItem[4] := Add_DItem(Print, G_BoxText, 
  1943.                                  Exit_Btn | Selectable,
  1944.                                  17, 7, 10, 1, -2, 4096 | 256 | 128);
  1945.        Set_DText(Print, PrintItem[4], 
  1946.                                  'Abort', System_Font, TE_Center);
  1947.  
  1948.        PrintScreen := Do_Dialog(Print, 2);
  1949.  
  1950.        if PrintScreen = 4 then
  1951.           AbortFlag := true
  1952.        else
  1953.           begin
  1954.             Get_DEdit(Print, PrintItem[2],  GetEditStr);
  1955.             if GetEditStr <> '' then
  1956.                ReadV(GetEditStr, PrintXs)
  1957.             else
  1958.                PrintXs := 1 ;
  1959.           end ;
  1960.  
  1961.        End_Dialog(Print);
  1962.        Delete_Dialog(Print);
  1963.      end ;
  1964.  
  1965.    
  1966.      var
  1967.         i,
  1968.         PrintXs    : short_integer ;
  1969.         OutputFile : Path_Name ;
  1970.         AbortFlag,
  1971.         PrintFlag  : boolean ;
  1972.         SaveMode   : short_integer ;
  1973.  
  1974.       Label 
  1975.         1 ;
  1976.  
  1977.       begin
  1978.         AbortFlag := false ;
  1979.         PrintRep(PrintXs, AbortFlag) ;
  1980.         if AbortFlag then GoTo 1 ;
  1981.         SaveMode := Mode ;
  1982.         Mode := 5 ;
  1983.         PrintFlag := true ;
  1984.         if PrintMode = 45 then
  1985.            Rewrite(Printer, 'LST:')
  1986.         else
  1987.            if PrintMode = 47 then
  1988.               begin
  1989.                 Hide_Mouse ;
  1990.                 Close_Window(WindNum) ;
  1991.                 Set_Clip(0,0,640,200 * Resolution) ;
  1992.                 Paint_Rect(0, 0, 640, 200 * Resolution) ;
  1993.                 Rewrite(Printer, 'CON:') ;
  1994.                 GoToXY(24,1) ;
  1995.                 Writeln ;
  1996.                 Writeln ;
  1997.                 GoToXY(1,1) ;
  1998.               end 
  1999.         else
  2000.            if Get_In_File(DefPathTxt, DefFileTxt) then
  2001.               Rewrite(Printer, DefFileTxt)
  2002.            else
  2003.               PrintFlag := false ;
  2004.  
  2005.         if PrintMode <> 47 then
  2006.            for i := 1 to 4 do
  2007.                if PrtFlag[i] then
  2008.                   InitPrinter(PrtInit[i]) ;
  2009.  
  2010.         if PrintFlag then
  2011.            begin
  2012.              for i := 1 to PrintXs do
  2013.                  begin
  2014.                    if P_Mode = 1 then
  2015.                       M_PrintRec                       { MULTIPLE LABELS }
  2016.                    else
  2017.                       if P_Mode = 2 then               { REPORT }
  2018.                          PrintReport 
  2019.                       else
  2020.                          PrintRec(D_CurrentRec[DataNum]) ; { SINGLE LABEL }
  2021.                  end ;
  2022.              Close(Printer) ;
  2023.            end ;
  2024.         Mode := SaveMode ;
  2025.            
  2026.         if PrintMode = 47 then
  2027.            begin
  2028.              Writeln('PRESS RETURN TO CONTINUE') ;
  2029.              Readln ;
  2030.              Open_Window(WindNum,0,0,0,0) ;
  2031.              Work_Rect(WindNum, x, y, w, h);
  2032.              Set_Clip(x, y, w, h);
  2033.              Draw_Menu(InfoMenu) ;
  2034.              Show_Mouse ;
  2035.            end ;
  2036. 1 :    end ;
  2037.  
  2038. { *************************************************************************
  2039.      Menu_Select interprets menu items selection from Event_Loop and
  2040.      calls the appropriate module.
  2041. ************************************************************************* }
  2042.   procedure Menu_Select( msg : Message_Buffer) ;
  2043.  
  2044.     var
  2045.         NewMode   : short_integer ;
  2046.  
  2047.      begin
  2048.        if Mode = 5 then
  2049.           EraseCursor(Report)
  2050.        else
  2051.           EraseCursor(ScrNum) ;
  2052.        NewMode := Mode ;
  2053.  
  2054.        Menu_Normal(InfoMenu, msg[3]);
  2055.        Case msg[4] of
  2056.           11 : CopyRight ;
  2057.           24 : Select_Open(NewMode) ;
  2058.           25 : Select_Save ;
  2059.           26 : Select_Close ;
  2060.           27 : ExitProgram ;
  2061.           28 : NewMode := 1 ;
  2062.           29 : SelectInput(NewMode) ;
  2063.           30 : SelectSearch(NewMode) ;
  2064.           31 : SelectSort(NewMode) ;
  2065.           32 : SelectOutput(NewMode) ;
  2066.           33 : Select_Enter ;
  2067.           34 : Select_Modify ;
  2068.           35 : SelectSearch(NewMode) ;
  2069.           36 : SelectSort(NewMode) ;
  2070.           37 : IncrementRecord(D_CurrentRec[DataNum], 1, true) ;
  2071.           38 : IncrementRecord(D_CurrentRec[DataNum], -1, true) ;
  2072.           39 : GoToFirst(D_CurrentRec[DataNum], true) ;
  2073.           40 : GoToLast(D_CurrentRec[DataNum], true) ;
  2074.           42 : SelectDelete ;
  2075.           44 : Press_Tab ;
  2076.           45,
  2077.           46,
  2078.           47 : SelectPrint(msg[4]) ;
  2079.        end ;           
  2080.  
  2081.        if (Mode <> NewMode) AND(msg[4] <> 42) then
  2082.           ChangeMode(Mode, NewMode) ;
  2083.  
  2084.        if WindNum > 0 then
  2085.           begin
  2086.             if Mode = 5 then
  2087.                NewCursor(Report)
  2088.             else
  2089.                NewCursor(ScrNum) ;
  2090.           end ;
  2091.     end;    
  2092.  
  2093.  
  2094. BEGIN
  2095. END .
  2096.  
  2097. {
  2098.    MAIN MENU 
  2099.  
  2100. DESK        File      Mode      Design    Record     Output
  2101. ----        ----      ----      ------    ------     ------
  2102.  InfoBase    Open      Design    Enter     Search     Print
  2103.              Save      Input     Modify    Sort       Disk
  2104.              Clear     Search              Next       Screen
  2105.              Quit      Sort                Previous  
  2106.                        Output              FirstRec  
  2107.                                            Last Rec  
  2108.                                           ----------
  2109.                                            DeleteRec
  2110.                                           ----------
  2111.                                            New Rec
  2112. ==============================================================
  2113.   Numerical values for Menu_Select :
  2114. Top Item      <24>      <28>      <33>      <35>       <45>
  2115. Bottom Item   <27>      <32>      <34>      <44>       <47>
  2116. ==============================================================
  2117. DESIGN MENU ITEM
  2118. ------ ---- ----
  2119.  
  2120.     File
  2121.     ----
  2122.      Open   -- Depending on the value of Mode, Open will open a 
  2123.                Design file or open a database file.
  2124.      Save   -- Depending on the value of Mode, Save will save a
  2125.                Design file or save a database file.
  2126.      Close  -- Close the current window and release memory to system.
  2127.      Quit   -- Close all windows and exit program.
  2128.  
  2129.     Mode
  2130.     ----
  2131.      Design -- Change the value of Mode to allow modification of
  2132.                the screen for database design.
  2133.      Input  -- Change the value of Mode to allow input of record
  2134.                information.
  2135.      Search -- Change Value of Mode to allow search pattern to be
  2136.                entered.
  2137.      Sort   -- Call Sort Routine.
  2138.      Output -- Enter Output Design Mode.
  2139.  
  2140.     Design
  2141.     ------
  2142.      Enter  -- Open dialog box to enter pertainent information for 
  2143.                inclusion at current cursor position.
  2144.      Modify -- Change label information at the current position by 
  2145.                re-opening dialog box.
  2146.  
  2147.     Record
  2148.     ------
  2149.      Search -- Process Search request.
  2150.      Sort   -- Process Sort Instructions.
  2151.      Next   -- Makes next record the current data record.
  2152.      Previous- Makes previous record the current data record.
  2153.      FirstRec- Move to First Record.
  2154.      Last Rec- Move to Last Record.
  2155.      Delete -- Delete Current Record (Same as ^D) .
  2156.      New Rec-- Create a new Record at end of list (Same as TAB) .
  2157.  
  2158.     Output
  2159.     ------
  2160.      Print -- Print report to printer.
  2161.      Disk  -- Print report to disk.
  2162.      Screen-- Print report to screen.
  2163. }
  2164.